/*
 * PagEventosAtividade.java
 * 
 * Projeto: Kruskal - SRAC
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */
package srac.controleatividades.cih;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import srac.controleatividades.cci.CtrlAtividade;
import srac.controleatividades.cdp.*;

public class PagEventosAtividade extends GenericForwardComposer {

    private CtrlAtividade ctrlAtividade = CtrlAtividade.getInstance();
    private Window winEventosAtividade;
    private Listbox listAtividades;
    private Div boxInformacao;
    private Menuitem submeterAtividades;
    private Menuitem gerarPDF;
    private Menuitem incluirAtividadeEvento;
    private Menuitem incluirAtividadeComplementar;
    private Menuitem excluirAtividadeComplementar;
    private Menuitem alterarAtividadeComplementar;
    
    private Label msg;
    private Aluno obj;
    private ArrayList<AtividadeComplementar> atividades;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        
        ctrlAtividade.setPagEventosAtividade(this);

        while (listAtividades.getItemCount() > 0) {
            listAtividades.removeItemAt(0);
        }

        //obtendo o aluno atual da session
        obj = (Aluno) Executions.getCurrent().getSession().getAttribute("aluno");
        
        //obtendo todas as atividades do aluno
        List<AtividadeComplementar> atividades = ctrlAtividade.obterAtividadesComplementares(obj);
        
        
        //obtendo a etapa atual
        Etapa e = ctrlAtividade.obterEtapaAtual();

        if (atividades != null) {
            for (int i = 0; i < atividades.size(); i++) {
                AtividadeComplementar a = atividades.get(i);
                Listitem linha = new Listitem("", a);

                linha.appendChild(new Listcell(a.getTipoAtividade().getCategoria().toString()));
                
                linha.appendChild(new Listcell(a.getTipoAtividade().toString()));
                
                linha.appendChild(new Listcell(a.getDescricao()));
                
                linha.appendChild(new Listcell(a.getCreditosRequeridos().toString()));   
                
                linha.appendChild(new Listcell(atividades.get(i).getStatusAtividadeComplementar().toString()));

                linha.setParent(listAtividades);
            }
        }

        //Caso não tenha etapa
        if (e == null) {
            submeterAtividades.setDisabled(true);
            gerarPDF.setDisabled(true);
        }
        
        //Caso a etapa esteja aberta para submissão
        else if(e.getStatusEtapa().equals(StatusEtapa.SUBMISSAO_ABERTA))
        {
           submeterAtividades.setDisabled(false);
           gerarPDF.setDisabled(false);
           alterarAtividadeComplementar.setDisabled(false);
           incluirAtividadeComplementar.setDisabled(false);
           excluirAtividadeComplementar.setDisabled(false);
        }
        
        //Caso a etapa não estaja aberta apra submissão
        else
        {
            submeterAtividades.setDisabled(true);
            gerarPDF.setDisabled(true);
        }
        
        
        //Se o aluno ja possui os créditos ou está inapto
        if (obj.getStatusSubmissao().equals(StatusSubmissao.ATIVIDADES_ACEITAS) || obj.getStatusSubmissao().equals(StatusSubmissao.INAPTO)) {
            submeterAtividades.setDisabled(true);
            gerarPDF.setDisabled(true);
            alterarAtividadeComplementar.setDisabled(true);
            incluirAtividadeComplementar.setDisabled(true);
            excluirAtividadeComplementar.setDisabled(true);
            if(obj.getStatusSubmissao().equals(StatusSubmissao.ATIVIDADES_ACEITAS))
            {
                setMensagemAviso("success", "Você conseguiu os créditos necessários com as atividades submetidas!");
            }
        }
         
    }

    public void onCreate$winEventosAtividades(Event event) {
        Usuario usuario = (Usuario) Executions.getCurrent().getSession().getAttribute("usuario");
        
        //if feito para verificar se existe algum usuario logado, se nao existir eh redirecionado para o login
        if (usuario == null) {
            Executions.sendRedirect("/");
            winEventosAtividade.detach();
        }
    }

    public void addAtividadeComplementar(AtividadeComplementar a) {
        Listitem linha = new Listitem("", a);

        linha.appendChild(new Listcell(a.getTipoAtividade().getCategoria().toString()));
        
        linha.appendChild(new Listcell(a.getTipoAtividade().toString()));
        
        linha.appendChild(new Listcell(a.getDescricao()));
        
        linha.appendChild(new Listcell(a.getCreditosRequeridos().toString()));

        linha.appendChild(new Listcell(a.getStatusAtividadeComplementar().toString()));

        linha.setParent(listAtividades);
    }

    //Atualiza apenas uma atividade
    public void refreshAtividadeComplementar(AtividadeComplementar a) {
        for (int i = 0; i < listAtividades.getItemCount(); i++) {
            if (listAtividades.getItemAtIndex(i).getValue() == a) {
                listAtividades.getItemAtIndex(i).getChildren().clear();
                listAtividades.getItemAtIndex(i).appendChild(new Listcell(""));
                listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.getTipoAtividade().getCategoria().toString()));
                listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.getTipoAtividade().toString()));
                listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.getDescricao()));
                listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.getCreditosRequeridos().toString()));
                listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.getStatusAtividadeComplementar().toString()));
                break;
            }
        }
    }
    
    //Atualiza uma lista de atividades
    public void refreshAtividadeComplementar(List<AtividadeComplementar> a) {
        for (int i = 0; i < listAtividades.getItemCount(); i++) {
            listAtividades.getItemAtIndex(i).getChildren().clear();
            listAtividades.getItemAtIndex(i).appendChild(new Listcell(""));
            listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.get(i).getTipoAtividade().getCategoria().toString()));
            listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.get(i).getTipoAtividade().toString()));
            listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.get(i).getDescricao()));
            listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.get(i).getCreditosRequeridos().toString()));
            listAtividades.getItemAtIndex(i).appendChild(new Listcell(a.get(i).getStatusAtividadeComplementar().toString()));
            }
    }

    //Exclui uma atividade complementar
    public void onClick$excluirAtividadeComplementar(Event event) {
        atividades = getSelecionadosList();
        if (atividades.size() == 1) { //Se houver alguma atividade selecionada
             eventoExcluir();
        } 
        else if (atividades.isEmpty()){
            setMensagemAviso("info", "Selecione uma Atividade Complementar!");
        }
        else
        {
            setMensagemAviso("info", "Selecione apenas uma Atividade Complementar!");
        }
    }
    
    //Inclui uma nova atividade
    public void onClick$incluirAtividadeComplementar(Event event) {
        ctrlAtividade.abrirIncluirAtividadeComplementar();
    }
    
    //Inclui uma nova atividade
    public void onClick$incluirAtividadeEvento(Event event) {
        ctrlAtividade.abrirIncluirAtividadeEvento(obj);
    }

    //Altera uma atividade
    public void onClick$alterarAtividadeComplementar(Event event) {
        atividades = getSelecionadosList();
        if (atividades.size() == 1) { //Se houver alguma atividade selecionada
            
            //Se o status da atividade for diferente de registrada, irregular ou rejeitada; ela não pode ser alterada
            if(!atividades.get(0).getStatusAtividadeComplementar().equals(StatusAtividadeComplementar.REGISTRADA) && !atividades.get(0).getStatusAtividadeComplementar().equals(StatusAtividadeComplementar.REJEITADA) && !atividades.get(0).getStatusAtividadeComplementar().equals(StatusAtividadeComplementar.IRREGULAR))
            {
                setMensagemAviso("error", "Não foi possível alterar a Atividade Complementar, já foi submetida!");
            }
            else
            {
                if(ctrlAtividade.obterEtapaAtual()!=null)
                {
                    if(!ctrlAtividade.obterEtapaAtual().equals(atividades.get(0).getEtapa()))
                    {
                        ctrlAtividade.abrirEditarAtividadeComplementar(atividades.get(0));
                        refreshAtividadeComplementar(atividades.get(0));
                    }
                    else
                    {
                        setMensagemAviso("error", "Não foi possível alterar a Atividade Complementar, já foi submetida e a etapa ainda não foi finalizada!");
                    }
                }
                else
                {
                    ctrlAtividade.abrirEditarAtividadeComplementar(atividades.get(0));
                    refreshAtividadeComplementar(atividades.get(0));
                }
            }
        } 
        else if (atividades.isEmpty()){
            setMensagemAviso("info", "Selecione uma Atividade Complementar!");
        }
        else
        {
            setMensagemAviso("info", "Selecione apenas uma Atividade Complementar!");
        }
    }

    public void onClick$consultarAtividadeComplementar(Event event) {
        atividades = getSelecionadosList();
        if (atividades.size() == 1) { //Se houver alguma atividade selecionada
            ctrlAtividade.abrirConsultarAtividadeComplementar(atividades.get(0));
        } 
        else if (atividades.isEmpty()){
            setMensagemAviso("info", "Selecione uma Atividade Complementar!");
        }
        else
        {
            setMensagemAviso("info", "Selecione apenas uma Atividade Complementar!");
        }
    }

    public void onClick$submeterAtividades(Event event) {
        atividades = getSelecionadosList();
        for (int i=0; i<atividades.size();i++) {
            if(!atividades.get(i).getStatusAtividadeComplementar().equals(StatusAtividadeComplementar.REGISTRADA))
            {
                atividades.remove(i);
                i--;
            }
        }
        if(atividades.isEmpty()) //Verifica se existem atividade com status de registrada
        {
           setMensagemAviso("info", "Nenhuma atividade registrada foi selecionada para ser submetida!"); 
        }
        else{ 
            ctrlAtividade.abrirConfirmarSubmissao(atividades, obj);
        }    
    }

    public void setMensagemAviso(String tipo, String mensagem) {
        boxInformacao.setClass(tipo);
        boxInformacao.setVisible(true);
        msg.setValue(mensagem);
    }

    public void onClick$boxInformacao(Event event) {
        boxInformacao.setVisible(false);
    }
    
   
    
    public void onClick$gerarPDF(Event event) {
        if(!ctrlAtividade.gerarResultados(obj)) //Verifica se existem atividades submetidas, se existirem a função gera o pdf
        {
            setMensagemAviso("error", "Não exitem atividades submetidas");
        }
    }
    
    public void onClick$baixarArquivo(Event event) {
        File arquivo;
        Listitem listitem = listAtividades.getSelectedItem(); //Pega a linha selecionada
        if (listitem != null) { //Se houver alguma atividade selecionada
            AtividadeComplementar a = listitem.getValue();
            arquivo = ctrlAtividade.recuperaArquivoPDF(a.getArquivo(), a.getAluno().getMatricula()); //Pega o arquivo do BD
            
            if (arquivo != null) {
                Filedownload fd = null;
                try {
                    fd.save(arquivo, null); //Baixa o arquivo
                } catch (FileNotFoundException ex) {
                    setMensagemAviso("error", "Erro em baixar o arquivo!");
                }
            }
        } else {
            setMensagemAviso("info", "Selecione uma Atividade Complementar!");
        }
    }
    
    public void eventoExcluir() //Metodo criado para exibir a msg de exclusão!
    {
        Messagebox.Button b1 = Messagebox.Button.YES;       
        Messagebox.Button b2 = Messagebox.Button.NO;
        Messagebox.Button [] b = new Messagebox.Button[2];
        b[0] = b1;
        b[1] = b2;

        EventListener <Messagebox.ClickEvent> e = new EventListener() { //Captura os eventos do mouse
            public void onEvent(Event evt) throws InterruptedException {
                if (evt.getName().equals("onYes")) { //Se o usuário clicar no botão de sim na popup
                    Listitem listitem = listAtividades.getSelectedItem(); //Pega a atividade selecionada
                    AtividadeComplementar a = listitem.getValue();
                    if (ctrlAtividade.apagarAtividadeComplementar(a)) { //Verifica se é possivel apagar, se for ele remove ela da lista
                        listAtividades.removeItemAt(listAtividades.getSelectedIndex());
                        setMensagemAviso("success", "Atividade excluída com sucesso!");
                    } 
                    else {
                        setMensagemAviso("error", "Não foi possível excluir a Atividade, já possui vinculos!"); 
                    }
                    
                }
            }
        };
        Messagebox.show("Deseja excluir a atividade?","Confirmação",b,Messagebox.QUESTION , e); //Mensagem de exclusão
    }
    
    public ArrayList getSelecionadosList() { //Pega as atividades selecionadas
        ArrayList<Listitem> l = new ArrayList<Listitem> (listAtividades.getSelectedItems());
        ArrayList<AtividadeComplementar> ativ = new ArrayList<AtividadeComplementar>();
        for (Listitem item : l) {
            ativ.add((AtividadeComplementar) item.getValue());
            
        }
        return ativ;
    }
}